$\newcommand{\xv}{\mathbf{x}} \newcommand{\Xv}{\mathbf{X}} \newcommand{\yv}{\mathbf{y}} \newcommand{\zv}{\mathbf{z}} \newcommand{\av}{\mathbf{a}} \newcommand{\Wv}{\mathbf{W}} \newcommand{\wv}{\mathbf{w}} \newcommand{\tv}{\mathbf{t}} \newcommand{\Tv}{\mathbf{T}} \newcommand{\muv}{\boldsymbol{\mu}} \newcommand{\sigmav}{\boldsymbol{\sigma}} \newcommand{\phiv}{\boldsymbol{\phi}} \newcommand{\Phiv}{\boldsymbol{\Phi}} \newcommand{\Sigmav}{\boldsymbol{\Sigma}} \newcommand{\Lambdav}{\boldsymbol{\Lambda}} \newcommand{\half}{\frac{1}{2}} \newcommand{\argmax}[1]{\underset{#1}{\operatorname{argmax}}} \newcommand{\argmin}[1]{\underset{#1}{\operatorname{argmin}}}$
Type your name here.
For this assignment, you will use the min-conflicts
code from the lecture notes to solve the following scheduling problem. Do not change this code in completing this assignment.
You are in charge of assigning classes to classrooms and times for the department. The scheduling is simplified by the fact at this imaginary university each class meets every day.
You have been asked to schedule these four class rooms:
Classes start on the hour. You can only assign classes to the hours of
You must schedule these 37 classes:
Your schedule must not violate any of the following constraints.
In addition to these constraints, let's add some preferences, which turns this CSP problem into a COP problem. Let's prefer schedules with the fewest number of classes scheduled at 8 am and 5 pm.
The variables for this COP problem are the classes. The values you assign to each class will be a tuple containing a room and a time.
assignments = schedule(classes, times, rooms, max_steps, n_solutions_to_test,)
¶Given:
classes
: list of all class names, like 'CS410'times
: list of all start times, like '10 am' and ' 1 pm'rooms
: list of all rooms, like 'CSB 325'max_steps
: maximum number of assignments to try, passed to min_conflicts
as the last argumentn_solutions_to_test
: call min_conflicts
this many times. For each solution, count the number of classes scheduled at 8 am or 5 pm. Keep track of the lowest number of classes at 8 am and 5 pm and the corresponding assignments of values to variables.Return:
assignments
: dictionary of best values assigned to variables (ones that have lowest number of classes scheduled at 8 am or 5pm), like {'CS410': ('CSB 425', '10 am'), ...}
assignments
will each be None
if a solution was not found.
result = constraints_ok(class_name_1, value_1, class_name_2, value_2)
¶Given:
class_name_1
: as above, like 'CS410'value_1
: tuple containing room and timeclass_name_2
: a second class namevalue_2
: another tuple containing a room and timeReturns:
result
: True
if the assignment of value_1
to class_name 1
and value_2
to class_name 2
doesnot violate any constraints. False
otherwise.
dataframe = display(assignments, rooms, times)
¶Given
assignments
: returned from your schedule
functionrooms
: list of all rooms as abovetimes
: list of all times as aboveReturns:
dataframe
: a pandas.DataFrame
of the solution, as shown in the example below.classes = ['CS160', 'CS163', 'CS164', 'CS165', 'CS192', 'CS199',
'CS220', 'CS270', 'CS253', 'CS245', 'CS250', 'CS280',
'CS320', 'CS314', 'CS356', 'CS370', 'CS380', 'CS390',
'CS410', 'CS414', 'CS420', 'CS425', 'CS430', 'CS435', 'CS440', 'CS445', 'CS453',
'CS510', 'CS514', 'CS520', 'CS530', 'CS533', 'CS535', 'CS540', 'CS545', 'CS548', 'CS553']
times = [' 8 am',
' 9 am',
'10 am',
'11 am',
'12 pm',
' 1 pm',
' 2 pm',
' 3 pm',
' 4 pm',
' 5 pm']
rooms = ['CSB 130', 'CSB 325', 'CSB 425',
'Clark 101'] #, 'Clark 102']
len(classes), len(times) * len(rooms)
(37, 40)
random.seed(555)
n_solutions_to_test = 1000
max_steps = 100
assignments = schedule(classes, times, rooms, max_steps, n_solutions_to_test)
Solution 1 is new best solution found in 2 steps, with 8 classes at 8 or 5. Solution 3 is new best solution found in 0 steps, with 7 classes at 8 or 5. Solution 6 is new best solution found in 8 steps, with 6 classes at 8 or 5. Solution 287 is new best solution found in 20 steps, with 5 classes at 8 or 5.
display(assignments, rooms, times)
CSB 130 | CSB 325 | CSB 425 | Clark 101 | |
---|---|---|---|---|
8 am | CS553 | CS280 | CS420 | |
9 am | CS535 | CS356 | CS250 | CS410 |
10 am | CS540 | CS160 | CS320 | CS245 |
11 am | CS390 | CS199 | CS435 | CS530 |
12 pm | CS533 | CS370 | CS425 | CS253 |
1 pm | CS165 | CS314 | CS453 | CS520 |
2 pm | CS430 | CS220 | CS163 | CS510 |
3 pm | CS164 | CS545 | CS270 | CS440 |
4 pm | CS548 | CS192 | CS445 | CS380 |
5 pm | CS514 | CS414 |
Do not include this section in your notebook.
Name your notebook Lastname-A5.ipynb
. So, for me it would be Anderson-A5.ipynb
. Submit the file using the Assignment 5
link on Canvas.
Download A5grader.tar and extract A5grader.py
from it.
%run -i A5grader.py
======================= Code Execution ======================= ['Anderson-A5.ipynb'] Extracting python code from notebook named 'Anderson-A5.ipynb' and storing in notebookcode.py Removing all statements that are not function or class defs or import statements. Testing constraints_ok('CS410', ('CSB 130', ' 9 am'), 'CS510', ('CSB 130', ' 9 am')) --- 10/10 points. Your constraints_ok function correctly returned False Testing constraints_ok('CS410', ('CSB 130', ' 9 am'), 'CS510', ('CSB 130', '10 am')) --- 10/10 points. Your constraints_ok function correctly returned True Testing constraints_ok('CS410', ('CSB 130', '10 am'), 'CS430', ('CSB 425', '10 am')) --- 10/10 points. Your constraints_ok function correctly returned False Testing classes = ['CS160', 'CS163', 'CS164', 'CS220', 'CS270', 'CS253', 'CS320', 'CS314', 'CS356', 'CS370', 'CS410', 'CS414', 'CS420', 'CS430', 'CS440', 'CS445', 'CS453', 'CS464', 'CS510', 'CS514', 'CS535', 'CS540', 'CS545'] times = [' 8 am', ' 9 am', '10 am', '11 am', '12 pm', ' 1 pm', ' 2 pm', ' 3 pm', ' 4 pm', ' 5 pm'] rooms = ['CSB 130', 'CSB 325', 'CSB 425'] random.seed(111) result = schedule(classes, times, rooms, 100, 10) Solution 1 is new best solution found in 0 steps, with 5 classes at 8 or 5. Solution 3 is new best solution found in 0 steps, with 3 classes at 8 or 5. --- 30/30 points. Your schedule function returned a valid schedule. Testing a call to schedule again with two more classes classes += ['CS554', 'CS551', 'CS552', 'CS555', 'CS898', 'CS899'] random.seed(333) result = schedule(classes, times, rooms, 1000, 10) n_classes_at_8 = len([(room, time) for (room, time) in assignment.values() if time.endswith('8 am')]) n_classes_at_5 = len([(room, time) for (room, time) in assignment.values() if time.endswith('5 pm')]) Solution 1 is new best solution found in 6 steps, with 6 classes at 8 or 5. Solution 3 is new best solution found in 2 steps, with 5 classes at 8 or 5. --- 30/30 points. Your schedule function correctly returned solution with 3 classes at 8 am or 5 pm. ====================================================================== A5 EXECUTION Grade is 90 / 90 ====================================================================== ___ / 10 points. Your display function returns the correct pandas.DataFrame. ====================================================================== A5 Additional Grade is __ / 10 ====================================================================== ====================================================================== A5 FINAL GRADE is _ / 100 ====================================================================== Extra Credit: Earn one point of extra credit for correct result from schedule_best_for_freshman and discussion about it.. A5 EXTRA CREDIT is 0 / 1
Let's give the freshman a break and try to schedule their courses in the middle of the day. So, solve the scheduling problem again but with the additional preference of:
Create a second version of schedule
called schedule_best_for_freshman
that includes this additional preference.